package sys

/*******************************************************************************
Copyright:cloud
Author:cloudapex@126.com
Version:1.0
Date:2020-06-12
Description: 菜单相关接口
*******************************************************************************/
import (
	"context"
	"service/model/mod"
	model "service/model/permis"

	gpc "gitee.com/cloudapex/protos/comm/pb"
	gpb "gitee.com/cloudapex/protos/permis/pb"

	"gitee.com/cloudapex/ulern/htp"
	"gitee.com/cloudapex/ulern/util"
	"github.com/gin-gonic/gin"
)

/*
 * 描述: 菜单列表
 * 路由: /menu/list
 * 方法: GET
 *********************************************************************/
type MenuList struct {
	Name  string       `form:"name" json:"name" binding:"omitempty,max=64"`    // 权限名称
	Type  model.EPower `form:"type" json:"type" binding:"omitempty"`           // 菜单类型(1:菜单;2:功能;3:数据)
	Match string       `form:"match" json:"match" binding:"omitempty,max=128"` // 权限匹配项(完全匹配)
	State int          `form:"state" json:"state" binding:"omitempty"`         // 状态(1:正常;2:失效)
}

func (this *MenuList) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	req := gpb.MenuListReq{CoId: user.CId}
	if err := util.Convert(&req, this); err != nil {
		return htp.RespConvertErr("", err)
	}

	rsp, err := model.Sysm.MenuList(ctx, &req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 菜单树表
 * 路由: /menu/tree
 * 方法: GET
 *********************************************************************/
type MenuTree struct{}

func (this *MenuTree) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	rsp, err := model.Sysm.MenuTree(ctx, &gpc.IdRequest{Id: user.CId})
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 新增菜单
 * 路由: /menu/add
 * 方法: POST
 *********************************************************************/
const ( // 错误码
	ECMAD_ParentNotFound htp.ECode = iota + 1 // 上级菜单不存在
)

type MenuAdd struct {
	ParentId int64        `form:"parentid" json:"parentid" binding:"omitempty"`       // 父Id
	Icon     string       `form:"icon" json:"icon" binding:"omitempty"`               // 图标
	Name     string       `form:"name" json:"name" binding:"required,max=64"`         // 权限名称
	Type     model.EPower `form:"type" json:"type" binding:"required"`                // 菜单类型(1:菜单;2:功能;3:数据)
	Match    string       `form:"match" json:"match" binding:"required,max=128"`      // 权限匹配项
	Comp     string       `form:"comp" json:"comp" binding:"omitempty,max=64"`        // 组件[菜单类型]
	UrlPath  string       `form:"urlPath" json:"urlPath" binding:"omitempty,max=128"` // 地址栏路径[菜单类型]
	Order    int          `form:"order" json:"order" binding:"omitempty"`             // 排序值
	State    int          `form:"state" json:"state" binding:"required"`              // 状态(1:正常;2:失效)
	Remark   string       `form:"remark" json:"remark" binding:"omitempty,max=128"`   // 备注
}

func (this *MenuAdd) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	req := gpb.MenuAddReq{CoId: user.CId}
	if err := util.Convert(&req, this); err != nil {
		return htp.RespConvertErr("", err)
	}

	rsp, err := model.Sysm.MenuAdd(ctx, &req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 编辑菜单
 * 路由: /menu/upd
 * 方法: POST
 *********************************************************************/

type MenuUpd struct {
	Id      int64        `form:"id" json:"id" binding:"required"`                    // 权限Id
	Icon    string       `form:"icon" json:"icon" binding:"omitempty"`               // 图标
	Name    string       `form:"name" json:"name" binding:"required,max=64"`         // 权限名称
	Type    model.EPower `form:"type" json:"type" binding:"required"`                // 菜单类型(1:菜单;2:功能;3:数据)
	Match   string       `form:"match" json:"match" binding:"required,max=128"`      // 权限匹配项
	Comp    string       `form:"comp" json:"comp" binding:"omitempty,max=64"`        // 组件[菜单类型]
	UrlPath string       `form:"urlPath" json:"urlPath" binding:"omitempty,max=128"` // 地址栏路径[菜单类型]
	Order   int          `form:"order" json:"order" binding:"omitempty"`             // 排序值
	State   int          `form:"state" json:"state" binding:"required"`              // 状态(1:正常;2:失效)
	Remark  string       `form:"remark" json:"remark" binding:"omitempty,max=128"`   // 备注
}

func (this *MenuUpd) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	req := gpb.MenuUpdReq{CoId: user.CId}
	if err := util.Convert(&req, this); err != nil {
		return htp.RespConvertErr("", err)
	}

	rsp, err := model.Sysm.MenuUpd(ctx, &req)
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}

/*
 * 描述: 删除菜单
 * 路由: /menu/del
 * 方法: POST
 *********************************************************************/

type MenuDel struct {
	Id int64 `form:"id" json:"id" binding:"required"` // 权限Id
}

func (this *MenuDel) Handle(c *gin.Context, ctx context.Context) htp.Response {
	user := mod.CurrUser(c)

	rsp, err := model.Sysm.MenuDel(ctx, &gpc.CoXIdRequest{CoId: user.CId, XId: this.Id})
	if err != nil {
		return htp.RespModelErr("", err)
	}
	return htp.RespOK("", rsp)
}
